"""
用户相关的 Pydantic 数据模式
用于 API 请求验证和响应序列化
"""
from pydantic import BaseModel, EmailStr
from typing import Optional
from datetime import datetime


class UserBase(BaseModel):
    """用户基础字段"""
    username: str  # 用户名
    email: EmailStr  # 邮箱地址（带验证）


class UserCreate(UserBase):
    """用户创建请求模式，继承基础字段并添加密码"""
    password: str  # 用户密码


class UserUpdate(BaseModel):
    """用户更新请求模式，所有字段可选"""
    username: Optional[str] = None  # 可选的新用户名
    email: Optional[EmailStr] = None  # 可选的新邮箱
    password: Optional[str] = None  # 可选的新密码


class UserResponse(UserBase):
    """用户响应模式，包含用户的基本信息和系统字段"""
    id: int  # 用户ID
    is_active: bool  # 是否激活
    created_at: datetime  # 创建时间
    
    class Config:
        from_attributes = True  # 允许从 ORM 对象创建


class Token(BaseModel):
    """JWT 令牌响应模式"""
    access_token: str  # 访问令牌
    token_type: str  # 令牌类型，通常为 "bearer"


class TokenData(BaseModel):
    """令牌数据模式"""
    user_id: Optional[int] = None  # 令牌中包含的用户ID


